#!/usr/bin/env bash

if [ $# -lt 2 ]; then
    echo "错误！ 需要两个参数: 节点IP 和 默认域名后缀。使用方式：kdo-install.sh 节点IP 默认域名后缀。"
    echo "节点IP：是安装的节点，如果有多个节点，选择第一个Master节点"
    echo "默认域名后缀：是集群的默认域名后缀，kdo平台发布的应用默认域名会以这个为后缀，比如应用abc的默认域名为abc.kube-do.dev"
    echo "假如节点IP为10.255.1.31, 默认域名后缀是kube-do.dev， 运行命令如下："
    echo "./kdo-install.sh 10.255.1.31 kube-do.dev"
    exit 1
fi


# 1. 先设置环境变量

# 环境变量KC_USER  KeyCloak平台的管理员用户，这个会和KDO平台的保持一致，不要修改
# 环境变量KC_PASS  KeyCloak平台的管理员的密码，这个会和KDO平台的保持一致
# 环境变量NODE_IP  KeyCloak安装节点Master的IP，如果有多个Master，就指定第一个，这个和安装kdo组件时节点IP要保持一致（这个IP必须能被客户端访问到）
# 环境变量DEFAULT_DOMAIN  KDO平台应用的默认域名后缀，这个和安装kdo组件时的保持一致
export KC_USER=admin
export KC_PASS=Kdo@Pass#2025
export NODE_IP=$1
export DEFAULT_DOMAIN=$2


## OIDC 参数，如果公司已有keycloak平台，请更新参数，默认是kdo内置keycloak, 不需要变动。
export OIDC_CLIENT_ID=kdo
export OIDC_CLIENT_SECRET=kubedo
export OIDC_ISSUER_URL=https://$NODE_IP:30443/realms/kdo

# 因为kdo平台的组件和业务的应用都是通过web的访问，使用要有一个默认域名,比如kubedo.dev。
# 如有dns服务器，需要把*.kubedo.dev指向kdo的master，ingress一般会部署到master上面
# 只要客户端就可以直接访问平台和部署在平台的应用了
export KDO_CONSOLE_URL=http://${NODE_IP}:30080

# 镜像仓库Harbor参数，可以更改管理员账号admin的密码，这个和KDO的默认密码一致
export REGISTRY_ADMIN_PASS=Kdo@Pass#2025
export REGISTRY_URL=http://${NODE_IP}:30002

# 应用webhook回调地址，一般无需变动
export PAC_CONTROLLER_URL=http://${NODE_IP}:30442

#这个脚本是kdo平台的自动化安装工具，在安装以前需要确定keycloak已经设置后，具体参考https://docs.kube-do.cn/docs/install/
read -p "*********注意**********
1. 这个脚本必须在Kubernetes的Master上执行；
2. 请确认以下信息是否正确：
   a. 节点IP： ${NODE_IP}
   b. 集群默认域名后缀： ${DEFAULT_DOMAIN}
3. 确认这个这个节点可以正常访问Internet。
更多信息请访问https://docs.kube-do.cn/docs/install
请确认？(y/N)" confirm
case $confirm in
  y|Y )
    echo "开始执行..."
    ;;
  * )
    echo "退出..."
    exit 1
    ;;
esac


echo "开始创建kdo默认的命名空间"
kubectl create namespace kubedo
kubectl create namespace kubedo-system
kubectl create namespace monitoring
kubectl create namespace openshift-logging


echo "开始安装nfs-server"
###  2. 安装nfs-server和创建nfs-provisioner
# 如果没有nfs server，需要手动安装一个， Almalinux/CentOS运行以下命令，
# 如果Ubuntu需要运行sudo apt install nfs-kernel-server -y
if [ -f /etc/os-release ]; then
    . /etc/os-release
    if [ "$ID" = "almalinux" ]; then
        showmount -e || dnf install nfs-utils -y

    elif [ "$ID" = "ubuntu" ]; then
        showmount -e || apt install nfs-kernel-server -y
    fi

    if [ ! -d /data/nfs ]; then
        mkdir -p /data/nfs
    fi

    grep -q "/data/nfs" /etc/exports && echo "nfs already found." || echo "/data/nfs *(rw,sync,no_root_squash,no_all_squash)" >> /etc/exports
    systemctl restart nfs-server && systemctl enable nfs-server
fi

echo "开始安装nfs-provisioner"
helm install nfs-subdir-external-provisioner oci://quay.io/kubedocharts/nfs-subdir-external-provisioner \
    --namespace kubedo-system \
    --create-namespace \
    --set storageClass.defaultClass=true \
    --version 4.0.18 \
    --set nfs.server=$NODE_IP \
    --set nfs.path=/data/nfs

echo "开始安装OIDC认证平台KeyCloak"
helm install keycloak  oci://quay.io/kubedocharts/keycloak \
     --version 15.1.4 --namespace kubedo-system \
     --set image.tag=21.1.1 \
     --set auth.adminUser=$KC_USER \
     --set auth.adminPassword=$KC_PASS \
     --set tls.enabled=true \
     --set tls.autoGenerated=true \
     --set service.type=NodePort \
     --set service.nodePorts.https=30443 \
     --set service.nodePorts.http=30440

until kubectl get pod keycloak-0 -n kubedo-system -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}' | grep True; do
    echo "等待 KeyCloak Pod 就绪..."
    sleep 10
done

echo "更新KeyCloak证书"
openssl req -newkey rsa:2048 -nodes -keyout tls.key -subj "/C=CN/ST=Hunan/L=ChangSha/O=kubedo/OU=kdo/CN=*.$DEFAULT_DOMAIN/emailAddress=$KC_USER@$DEFAULT_DOMAIN" -out tls.csr  && \
openssl x509 -req -extfile <(printf "subjectAltName=DNS:*.$DEFAULT_DOMAIN,IP:$NODE_IP") -days 3650 -in tls.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out tls.crt
kubectl delete secret -n kubedo-system keycloak-crt && kubectl create secret tls -n kubedo-system keycloak-crt --cert=./tls.crt --key=./tls.key  && kubectl rollout restart statefulset -n kubedo-system keycloak

rm -rf tls.*

echo "开始安装ingress-nginx ..."
helm install ingress-nginx  oci://quay.io/kubedocharts/ingress-nginx --version 4.11.1 --namespace ingress-nginx --create-namespace \
--set controller.hostPort.enabled=true --set controller.service.type=ClusterIP

echo "开始安装kdo组件-镜像Harbor ..."
helm install harbor oci://quay.io/kubedocharts/harbor --version 1.12.2 --namespace harbor --create-namespace \
--set externalURL="${REGISTRY_URL}" --set expose.type=nodePort --set harborAdminPassword=${REGISTRY_ADMIN_PASS}

echo "开始安装cert-manager ..."
helm install cert-manager oci://quay.io/kubedocharts/cert-manager  --version v1.15.2 --namespace cert-manager --create-namespace  --set crds.enabled=true

echo "开始应用角色权限 ..."
kubectl create  -f project-role
kubectl replace -f project-role/system_basic-user.yaml

echo "开始安装对象存储minio(用于日志平台) ..."
helm install minio oci://quay.io/kubedocharts/minio --version 5.4.0 --create-namespace -n openshift-logging \
--set resources.requests.memory=128Mi --set replicas=1 --set buckets[0].name=loki-k8s --set mode=standalone \
--set rootUser=admin,rootPassword=1MKok8eCvp

echo "开始安装kdo组件-kdo控制器 ..."
kubectl create -f  kdc/release.yaml

echo "开始安装kdo组件-Operator组件olm ..."
kubectl create -f operators/olm/v0.28.0/crds.yaml

echo "开始安装kdo组件-devfile ..."
kubectl create -f  devfile/devworkspace/combined.yaml

echo "开始安装kdo组件-Helm组件kubeapps ..."
helm install kubeapps oci://quay.io/kubedocharts/kubeapps --namespace kubeapps --create-namespace --version 16.0.1
kubectl create -f helm/crds.yaml

echo "开始安装kdo组件-监控组件kube-prometheus ..."
kubectl create -f  prometheus/v0.13.0/manifests/setup/

echo "开始安装kdo组件-流水线组件tekton  ..."
kubectl create -f  tekton/operator/v0.70.0/release.yaml

echo "开始安装kdo组件-日志组件Loki ..."
kubectl create -f logging/loki-operator.yaml
kubectl create -f logging/cluster-logging-operator.yaml

kubectl delete apprepositories.kubeapps.com -n kubeapps bitnami

until kubectl get deployment harbor-core -n harbor -o jsonpath='{.status.conditions[?(@.type=="Available")].status}' | grep True; do
    echo "正在拉取镜像，等待镜像仓库Harbor就绪..."
    sleep 10
done

until kubectl get deployment tekton-pipelines-controller -n tekton-pipelines -o jsonpath='{.status.conditions[?(@.type=="Available")].status}' | grep True; do
    echo "正在拉取镜像，等待流水线组件Tekton就绪..."
    sleep 10
done



echo "开始安装kdo组件-console ..."
envsubst < console/deployment.yaml | kubectl apply -f -
kubectl create -f operators/olm/v0.28.0/olm.yaml
kubectl create -f helm/kubedo.yaml
kubectl create -f prometheus/v0.13.0/manifests/
envsubst < prometheus/v0.13.0/patch/grafana-config.yaml | kubectl apply -f -
kubectl create -f tekton/clustertask/clustertasks.yaml
kubectl create -f tekton/metrics/pipeline-monitoring.yaml
kubectl apply -f tekton/patch
envsubst < tekton/pipelines-as-code/release.k8s.yaml | kubectl create -f -
kubectl apply -f tekton/pipelines-as-code/crb.yaml
kubectl create -f tekton/pipelines-as-code/kubedo-cm.yaml
kubectl create -f shipwright/v0.13/release.yaml
kubectl create -f devfile/devworkspace/web-terminal.yaml
kubectl create -f logging/lokistack-dev.yaml
kubectl create -f logging/clusterlogforwarder.yaml
kubectl create -f logging/eventrouter.yaml
kubectl create -f samples/appproject.yaml
# 启用Tekton result功能，可以获取历史流水线执行结果
kubectl patch tektonconfigs.operator.tekton.dev config  --type='merge'  -p '{"spec":{"result":{"disabled":false}}}'
sleep 2
kubectl create -f samples/appenvs.yaml
kubectl rollout restart deployment -n kubedo-system kdc-controller-manager

until kubectl get deployment console -n kubedo-system -o jsonpath='{.status.conditions[?(@.type=="Available")].status}' | grep True; do
    echo "正在拉取镜像，等待KDO Web Console组件就绪..."
    sleep 10
done

echo "KDO平台已经安装完成"
echo "在Master节点运行 kubectl get pod -n kubedo-system 查看kdo核心组件是否正常运行。如果没有正常，可以重新运行一次脚本"
echo "通过打开 ${KDO_CONSOLE_URL} 就可以访问KDO平台。管理员用户就是在安装KeyCloak设置的，默认管理员账号：${KC_USER}， 默认管理员密码：${KC_PASS}"

printf "现在已经创建默认的项目kdo, 里面有4个环境：开发(dev)、测试(test)、预发(stage)、生产(prod)。
如果是内置的KeyCloak平台已经创建四个用户:项目管理员： pa1，项目开发者: dev1，项目测试人员: qa1, 项目运维人员: ops1, 他们的默认密码都是: Kdo#2025
现在可以通过这些用户来体验KDO平台了.\n
更多详细信息请访问 https://docs.kube-do.cn/docs/install \n"


